﻿using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data;
using System.Text;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;
using Sinacor.Infra.Service.Common;

namespace Sinacor.Servico.Bovespa.Movimento.ResourceAccess
{
    public class ControleMovimentoOrdens : BaseResourceAccess
    {
        #region Construtor

        /// <summary>
        /// Construtor
        /// </summary>
        public ControleMovimentoOrdens() : base(AuthorizationContext.Current.CompanyId) { }

        #endregion

        #region Métodos Públicos

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public BusinessEntity.Resultado AbrirMovimento()
        {
            #region Comando SQL

            BusinessEntity.Resultado resultado = new BusinessEntity.Resultado();
            StringBuilder sql = new StringBuilder();

            sql.Append("DECLARE rettype BOOLEAN; ");
            sql.Append("BEGIN ");
            sql.Append("rettype:= pOr_Abre.fOr_Abre(:P_nCodEmpr,:R_sDataAber,:R_sDataDia,:R_nErro,:R_sErro,:R_sArgs);");
            sql.Append("IF rettype THEN :R_Retorno := 1; ELSE :R_Retorno := 0; END IF; ");
            sql.Append("END; ");

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                #region Adição dos parâmetros

                DbParameter parametroP_nCodEmpr = dbCommand.CreateParameter();
                parametroP_nCodEmpr.ParameterName = "P_nCodEmpr";
                parametroP_nCodEmpr.Direction = ParameterDirection.Input;
                parametroP_nCodEmpr.DbType = DbType.Int32;
                parametroP_nCodEmpr.Value = AuthorizationContext.Current.CompanyId;

                dbCommand.Parameters.Add(parametroP_nCodEmpr);

                DbParameter parametroR_sDataAber = dbCommand.CreateParameter();
                parametroR_sDataAber.ParameterName = "R_sDataAber";
                parametroR_sDataAber.Direction = ParameterDirection.Output;
                parametroR_sDataAber.DbType = DbType.String;
                parametroR_sDataAber.Size = 4000;
                parametroR_sDataAber.Value = null;

                dbCommand.Parameters.Add(parametroR_sDataAber);

                DbParameter parametroR_sDataDia = dbCommand.CreateParameter();
                parametroR_sDataDia.ParameterName = "R_sDataDia";
                parametroR_sDataDia.Direction = ParameterDirection.Output;
                parametroR_sDataDia.DbType = DbType.String;
                parametroR_sDataDia.Size = 4000;
                parametroR_sDataDia.Value = null;

                dbCommand.Parameters.Add(parametroR_sDataDia);

                DbParameter parametroR_nErro = dbCommand.CreateParameter();
                parametroR_nErro.ParameterName = "R_nErro";
                parametroR_nErro.Direction = ParameterDirection.Output;
                parametroR_nErro.DbType = DbType.Int32;
                parametroR_nErro.Value = 0;

                dbCommand.Parameters.Add(parametroR_nErro);

                DbParameter parametroR_sErro = dbCommand.CreateParameter();
                parametroR_sErro.ParameterName = "R_sErro";
                parametroR_sErro.Direction = ParameterDirection.Output;
                parametroR_sErro.DbType = DbType.String;
                parametroR_sErro.Size = 4000;
                parametroR_sErro.Value = null;

                dbCommand.Parameters.Add(parametroR_sErro);

                DbParameter parametroR_sArgs = dbCommand.CreateParameter();
                parametroR_sArgs.ParameterName = "R_sArgs";
                parametroR_sArgs.Direction = ParameterDirection.Output;
                parametroR_sArgs.DbType = DbType.String;
                parametroR_sArgs.Size = 4000;
                parametroR_sArgs.Value = null;

                dbCommand.Parameters.Add(parametroR_sArgs);

                DbParameter parametrorettype = dbCommand.CreateParameter();
                parametrorettype.ParameterName = "R_Retorno";
                parametrorettype.Direction = ParameterDirection.Output;
                parametrorettype.DbType = DbType.Int32;
                parametrorettype.Value = 0;

                dbCommand.Parameters.Add(parametrorettype);


                #endregion

                #region Execução

                this.DataBase.ExecuteNonQuery(dbCommand);

                if (!Convert.ToBoolean(this.DataBase.GetParameterValue(dbCommand, "R_Retorno")))
                {
                    resultado.Sucesso = false;
                    resultado.CodigoErro = Convert.ToInt32(parametroR_nErro.Value);
                    resultado.Argumentos = Convert.ToString(parametroR_sArgs.Value);
                }
                else
                {
                    resultado.Sucesso = true;
                    resultado.DataMovimento = Convert.ToDateTime(parametroR_sDataAber.Value, new System.Globalization.CultureInfo("pt-BR"));
                }

                #endregion            
            }

            return resultado;

            #endregion
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        public void AlterarEstadoMovimento(BusinessEntity.Enum.TipoMovimento request)
        {
            #region Comando SQL

            string sql = "UPDATE TORDATMOV SET TP_MOVIMENTO = :TipoMovimento";  

            #endregion

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql))
            {
                #region Adição dos parâmetros

                this.DataBase.AddInParameter(dbCommand, "TipoMovimento", DbType.String, EnumConverter.ToString<BusinessEntity.Enum.TipoMovimento>(request));

                #endregion

                #region Execução

                this.DataBase.ExecuteNonQuery(dbCommand);

                #endregion
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public BusinessEntity.Resultado ExecutarFuncaoFechamento(BusinessEntity.Enum.TipoFechamento request)
        {
            #region Comando SQL

            BusinessEntity.Resultado resultado = new BusinessEntity.Resultado();
            StringBuilder sql = new StringBuilder();

            sql.Append("DECLARE rettype BOOLEAN; ");
            sql.Append("BEGIN ");
            sql.Append("rettype:= pOr_Fecha.fOr_Fecha(:P_sTipo,:R_nErro,:R_sErro,:R_sArgs);");
            sql.Append("IF rettype THEN :R_Retorno := 1; ELSE :R_Retorno := 0; END IF; ");
            sql.Append("END; ");

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                #region Adição dos parâmetros

                DbParameter parametroP_sTipo = dbCommand.CreateParameter();
                parametroP_sTipo.ParameterName = "P_sTipo";
                parametroP_sTipo.Direction = ParameterDirection.Input;
                parametroP_sTipo.DbType = DbType.String;
                parametroP_sTipo.Value = EnumConverter.ToString<BusinessEntity.Enum.TipoFechamento>(request);

                dbCommand.Parameters.Add(parametroP_sTipo);

                DbParameter parametroR_nErro = dbCommand.CreateParameter();
                parametroR_nErro.ParameterName = "R_nErro";
                parametroR_nErro.Direction = ParameterDirection.Output;
                parametroR_nErro.DbType = DbType.Int32;
                parametroR_nErro.Value = 0;

                dbCommand.Parameters.Add(parametroR_nErro);

                DbParameter parametroR_sErro = dbCommand.CreateParameter();
                parametroR_sErro.ParameterName = "R_sErro";
                parametroR_sErro.Direction = ParameterDirection.Output;
                parametroR_sErro.DbType = DbType.String;
                parametroR_sErro.Size = 4000;
                parametroR_sErro.Value = null;

                dbCommand.Parameters.Add(parametroR_sErro);

                DbParameter parametroR_sArgs = dbCommand.CreateParameter();
                parametroR_sArgs.ParameterName = "R_sArgs";
                parametroR_sArgs.Direction = ParameterDirection.Output;
                parametroR_sArgs.DbType = DbType.String;
                parametroR_sArgs.Size = 4000;
                parametroR_sArgs.Value = null;

                dbCommand.Parameters.Add(parametroR_sArgs);

                DbParameter parametrorettype = dbCommand.CreateParameter();
                parametrorettype.ParameterName = "R_Retorno";
                parametrorettype.Direction = ParameterDirection.Output;
                parametrorettype.DbType = DbType.Int32;
                parametrorettype.Value = 0;

                dbCommand.Parameters.Add(parametrorettype);

                #endregion

                #region Execução

                this.DataBase.ExecuteNonQuery(dbCommand);

                if (!Convert.ToBoolean(this.DataBase.GetParameterValue(dbCommand, "R_Retorno")))
                {
                    resultado.Sucesso = false;
                    resultado.CodigoErro = Convert.ToInt32(parametroR_nErro.Value);
                    resultado.Argumentos = Convert.ToString(parametroR_sArgs.Value);
                }
                else
                    resultado.Sucesso = true;                

                #endregion          
            }

            return resultado;

            #endregion
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public BusinessEntity.Resultado GravarInconsistencias()
        {
            #region Comando SQL

            StringBuilder sql = new StringBuilder();
            BusinessEntity.Resultado resultado = new BusinessEntity.Resultado();

            sql.Append("DECLARE rettype BOOLEAN; ");
            sql.Append("BEGIN ");
            sql.Append("rettype:= pOr_Consiste.fOr_SalvaAlerta(:P_sDataMvto,:P_nCdUsuario,:R_nErro,:R_sErro,:R_sArgs);");
            sql.Append("IF rettype THEN :R_Retorno := 1; ELSE :R_Retorno := 0; END IF; ");
            sql.Append("END; ");

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                #region Adição dos parâmetros

                DbParameter parametroP_sDataMvto = dbCommand.CreateParameter();
                parametroP_sDataMvto.ParameterName = "P_sDataMvto";
                parametroP_sDataMvto.Direction = ParameterDirection.Input;
                parametroP_sDataMvto.DbType = DbType.String;
                parametroP_sDataMvto.Value = DateTime.Now.ToString("dd/MM/yyyy");

                dbCommand.Parameters.Add(parametroP_sDataMvto);

                DbParameter parametroP_nCdUsuario = dbCommand.CreateParameter();
                parametroP_nCdUsuario.ParameterName = "P_nCdUsuario";
                parametroP_nCdUsuario.Direction = ParameterDirection.Input;
                parametroP_nCdUsuario.DbType = DbType.Int32;
                parametroP_nCdUsuario.Value = AuthorizationContext.Current.CompanyId;

                dbCommand.Parameters.Add(parametroP_nCdUsuario);

                DbParameter parametroR_nErro = dbCommand.CreateParameter();
                parametroR_nErro.ParameterName = "R_nErro";
                parametroR_nErro.Direction = ParameterDirection.Output;
                parametroR_nErro.DbType = DbType.Int32;
                parametroR_nErro.Value = 0;

                dbCommand.Parameters.Add(parametroR_nErro);

                DbParameter parametroR_sErro = dbCommand.CreateParameter();
                parametroR_sErro.ParameterName = "R_sErro";
                parametroR_sErro.Direction = ParameterDirection.Output;
                parametroR_sErro.DbType = DbType.String;
                parametroR_sErro.Size = 4000;
                parametroR_sErro.Value = null;

                dbCommand.Parameters.Add(parametroR_sErro);

                DbParameter parametroR_sArgs = dbCommand.CreateParameter();
                parametroR_sArgs.ParameterName = "R_sArgs";
                parametroR_sArgs.Direction = ParameterDirection.Output;
                parametroR_sArgs.DbType = DbType.String;
                parametroR_sArgs.Size = 4000;
                parametroR_sArgs.Value = null;

                dbCommand.Parameters.Add(parametroR_sArgs);

                DbParameter parametrorettype = dbCommand.CreateParameter();
                parametrorettype.ParameterName = "R_Retorno";
                parametrorettype.Direction = ParameterDirection.Output;
                parametrorettype.DbType = DbType.Int32;
                parametrorettype.Value = 0;

                dbCommand.Parameters.Add(parametrorettype);

                #endregion

                #region Execução

                this.DataBase.ExecuteNonQuery(dbCommand);

                if (!Convert.ToBoolean(this.DataBase.GetParameterValue(dbCommand, "R_Retorno")))
                {
                    resultado.Sucesso = false;
                    resultado.CodigoErro = Convert.ToInt32(parametroR_nErro.Value);
                    resultado.Argumentos = Convert.ToString(parametroR_sArgs.Value);
                }
                else
                    resultado.Sucesso = true;

                

                #endregion            
            }

            return resultado;

            #endregion
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public BusinessEntity.EstadoMovimento ObterEstadoMovimento()
        {
            #region Comando SQL

            string sql = "SELECT TP_MOVIMENTO AS TipoMovimento FROM TORDATMOV";            

            #endregion

            #region Execução

            BusinessEntity.EstadoMovimento response = new BusinessEntity.EstadoMovimento();

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql))
            {
                response = this.FindOne<BusinessEntity.EstadoMovimento>(dbCommand,
                    reader =>
                    {
                        BusinessEntity.EstadoMovimento entity = new Sinacor.Servico.Bovespa.Movimento.BusinessEntity.EstadoMovimento();
                        entity.Estado = EnumConverter.Parse<BusinessEntity.Enum.TipoMovimento>(reader["TipoMovimento"].ToString());
                        return entity;
                    });
            }            

            return response;

            #endregion            
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public BusinessEntity.InformacoesMovimento ObterInformacoesMovimento(BusinessEntity.DataMovimento request)
        {
            #region Comando SQL

            StringBuilder sql = new StringBuilder();

            sql.Append("SELECT ");
            sql.Append("DT_DATMOV AS DataMovimento, ");
            sql.Append("TP_MOVIMENTO AS TipoMovimento, ");
            sql.Append("DT_VERSAO AS DataVersao ");
            sql.Append("FROM TORDATMOV ");

            //Filtro Opcional
            if(request.Valor.HasValue)
                if (request.Valor.Value != DateTime.MinValue)
                    sql.Append("WHERE DT_DATMOV = :DataMovimento");            

            #endregion            

            #region Execução

            BusinessEntity.InformacoesMovimento response = new BusinessEntity.InformacoesMovimento();

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                #region Adição dos parâmetros

                if (request.Valor.HasValue)
                    if (request.Valor.Value != DateTime.MinValue)
                        this.DataBase.AddInParameter(dbCommand, "DataMovimento", DbType.DateTime, request.Valor);

                #endregion

                response = this.FindOne<BusinessEntity.InformacoesMovimento>(dbCommand,
                    reader =>
                    {
                        BusinessEntity.InformacoesMovimento entity = new BusinessEntity.InformacoesMovimento();

                        entity.DataMovimento = reader.GetValue<DateTime>("DataMovimento");
                        entity.EstadoMovimento = EnumConverter.Parse<BusinessEntity.Enum.TipoMovimento>(reader["TipoMovimento"].ToString());
                        entity.DataVersao = reader.GetValue<DateTime>("DataVersao");

                        return entity;
                    });                
            }

            return response;

            #endregion            
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public BusinessEntity.Resultado ValidarControleMovimento(BusinessEntity.Enum.TipoMovimento request)
        {
            #region Comando SQL

            StringBuilder sql = new StringBuilder();

            sql.Append("DECLARE rettype BOOLEAN; ");
            sql.Append("BEGIN ");
            sql.Append("rettype:= pOr_Consiste.fOr_FazProcesso (:P_sProcesso,:R_nErro,:R_sErro,:R_sArgs);");
            sql.Append("IF rettype THEN :R_Retorno := 1; ELSE :R_Retorno := 0; END IF; ");
            sql.Append("END; ");            

            #endregion           

            #region Execução

            BusinessEntity.Resultado resultado = new BusinessEntity.Resultado();

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                #region Adição dos parâmetros

                DbParameter parametroP_sProcesso = dbCommand.CreateParameter();
                parametroP_sProcesso.ParameterName = "P_sProcesso";
                parametroP_sProcesso.Direction = ParameterDirection.Input;
                parametroP_sProcesso.DbType = DbType.String;
                parametroP_sProcesso.Value = EnumConverter.ToString<BusinessEntity.Enum.TipoMovimento>(request);

                dbCommand.Parameters.Add(parametroP_sProcesso);

                DbParameter parametroR_nErro = dbCommand.CreateParameter();
                parametroR_nErro.ParameterName = "R_nErro";
                parametroR_nErro.Direction = ParameterDirection.Output;
                parametroR_nErro.DbType = DbType.Int32;
                parametroR_nErro.Value = 0;

                dbCommand.Parameters.Add(parametroR_nErro);

                DbParameter parametroR_sErro = dbCommand.CreateParameter();
                parametroR_sErro.ParameterName = "R_sErro";
                parametroR_sErro.Direction = ParameterDirection.Output;
                parametroR_sErro.DbType = DbType.String;
                parametroR_sErro.Size = 4000;
                parametroR_sErro.Value = null;

                dbCommand.Parameters.Add(parametroR_sErro);

                DbParameter parametroR_sArgs = dbCommand.CreateParameter();
                parametroR_sArgs.ParameterName = "R_sArgs";
                parametroR_sArgs.Direction = ParameterDirection.Output;
                parametroR_sArgs.DbType = DbType.String;
                parametroR_sArgs.Size = 4000;
                parametroR_sArgs.Value = null;

                dbCommand.Parameters.Add(parametroR_sArgs);

                DbParameter parametrorettype = dbCommand.CreateParameter();
                parametrorettype.ParameterName = "R_Retorno";
                parametrorettype.Direction = ParameterDirection.Output;
                parametrorettype.DbType = DbType.Int32;
                parametrorettype.Value = 0;

                dbCommand.Parameters.Add(parametrorettype);

                #endregion

                this.DataBase.ExecuteNonQuery(dbCommand);

                if (!Convert.ToBoolean(this.DataBase.GetParameterValue(dbCommand, "R_Retorno")))
                {
                    resultado.Sucesso = false;
                    resultado.CodigoErro = Convert.ToInt32(parametroR_nErro.Value);
                    resultado.Argumentos = Convert.ToString(parametroR_sArgs.Value);
                }
                else
                    resultado.Sucesso = true;
            }            

            return resultado;

            #endregion            
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public BusinessEntity.Resultado ValidarFechamentoMovimento(BusinessEntity.DataMovimento request)
        {
            #region Comando SQL

            StringBuilder sql = new StringBuilder();

            sql.Append("DECLARE rettype BOOLEAN; ");
            sql.Append("BEGIN ");
            sql.Append("rettype:= pOr_Consiste.fOr_ConsisteFech (:P_sDataMvto,:R_nErro,:R_sErro,:R_sArgs);");
            sql.Append("IF rettype THEN :R_Retorno := 1; ELSE :R_Retorno := 0; END IF; ");
            sql.Append("END; ");            

            #endregion           

            #region Execução

            BusinessEntity.Resultado resultado = new BusinessEntity.Resultado();

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                #region Adição dos parâmetros

                DbParameter parametroP_sDataMvto = dbCommand.CreateParameter();
                parametroP_sDataMvto.ParameterName = "P_sDataMvto";
                parametroP_sDataMvto.Direction = ParameterDirection.Input;
                parametroP_sDataMvto.DbType = DbType.String;
                parametroP_sDataMvto.Value = request.Valor.Value.ToString("dd/MM/yyyy");

                dbCommand.Parameters.Add(parametroP_sDataMvto);

                DbParameter parametroR_nErro = dbCommand.CreateParameter();
                parametroR_nErro.ParameterName = "R_nErro";
                parametroR_nErro.Direction = ParameterDirection.Output;
                parametroR_nErro.DbType = DbType.Int32;
                parametroR_nErro.Value = 0;

                dbCommand.Parameters.Add(parametroR_nErro);

                DbParameter parametroR_sErro = dbCommand.CreateParameter();
                parametroR_sErro.ParameterName = "R_sErro";
                parametroR_sErro.Direction = ParameterDirection.Output;
                parametroR_sErro.DbType = DbType.String;
                parametroR_sErro.Size = 4000;
                parametroR_sErro.Value = null;

                dbCommand.Parameters.Add(parametroR_sErro);

                DbParameter parametroR_sArgs = dbCommand.CreateParameter();
                parametroR_sArgs.ParameterName = "R_sArgs";
                parametroR_sArgs.Direction = ParameterDirection.Output;
                parametroR_sArgs.DbType = DbType.String;
                parametroR_sArgs.Size = 4000;
                parametroR_sArgs.Value = null;

                dbCommand.Parameters.Add(parametroR_sArgs);

                DbParameter parametrorettype = dbCommand.CreateParameter();
                parametrorettype.ParameterName = "R_Retorno";
                parametrorettype.Direction = ParameterDirection.Output;
                parametrorettype.DbType = DbType.Int32;
                parametrorettype.Value = 0;

                dbCommand.Parameters.Add(parametrorettype);

                #endregion

                this.DataBase.ExecuteNonQuery(dbCommand);

                if (!Convert.ToBoolean(this.DataBase.GetParameterValue(dbCommand, "R_Retorno")))
                {
                    resultado.Sucesso = false;
                    resultado.CodigoErro = Convert.ToInt32(parametroR_nErro.Value);
                    resultado.Argumentos = Convert.ToString(parametroR_sArgs.Value);
                }
                else
                    resultado.Sucesso = true;
            }            

            return resultado;

            #endregion            
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public BusinessEntity.Resultado VerificarInconsistenciasFechamento(BusinessEntity.DataMovimento request)
        {
            #region Comando SQL

            StringBuilder sql = new StringBuilder();

            sql.Append("DECLARE rettype BOOLEAN; ");
            sql.Append("BEGIN ");
            sql.Append("rettype:= pOr_Consiste.fOr_Alerta (:P_sDataMvto,:R_nErro,:R_sErro,:R_sArgs);");
            sql.Append("IF rettype THEN :R_Retorno := 1; ELSE :R_Retorno := 0; END IF; ");
            sql.Append("END; ");            

            #endregion            

            #region Execução

            BusinessEntity.Resultado resultado = new BusinessEntity.Resultado();

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                #region Adição dos parâmetros

                DbParameter parametroP_sDataMvto = dbCommand.CreateParameter();
                parametroP_sDataMvto.ParameterName = "P_sDataMvto";
                parametroP_sDataMvto.Direction = ParameterDirection.Input;
                parametroP_sDataMvto.DbType = DbType.String;
                parametroP_sDataMvto.Value = request.Valor.Value.ToString("dd/MM/yyyy");

                dbCommand.Parameters.Add(parametroP_sDataMvto);

                DbParameter parametroR_nErro = dbCommand.CreateParameter();
                parametroR_nErro.ParameterName = "R_nErro";
                parametroR_nErro.Direction = ParameterDirection.Output;
                parametroR_nErro.DbType = DbType.Int32;
                parametroR_nErro.Value = 0;

                dbCommand.Parameters.Add(parametroR_nErro);

                DbParameter parametroR_sErro = dbCommand.CreateParameter();
                parametroR_sErro.ParameterName = "R_sErro";
                parametroR_sErro.Direction = ParameterDirection.Output;
                parametroR_sErro.DbType = DbType.String;
                parametroR_sErro.Size = 4000;
                parametroR_sErro.Value = null;

                dbCommand.Parameters.Add(parametroR_sErro);

                DbParameter parametroR_sArgs = dbCommand.CreateParameter();
                parametroR_sArgs.ParameterName = "R_sArgs";
                parametroR_sArgs.Direction = ParameterDirection.Output;
                parametroR_sArgs.DbType = DbType.String;
                parametroR_sArgs.Size = 4000;
                parametroR_sArgs.Value = null;

                dbCommand.Parameters.Add(parametroR_sArgs);

                DbParameter parametrorettype = dbCommand.CreateParameter();
                parametrorettype.ParameterName = "R_Retorno";
                parametrorettype.Direction = ParameterDirection.Output;
                parametrorettype.DbType = DbType.Int32;
                parametrorettype.Value = 0;

                dbCommand.Parameters.Add(parametrorettype);

                #endregion

                this.DataBase.ExecuteNonQuery(dbCommand);

                if (!Convert.ToBoolean(this.DataBase.GetParameterValue(dbCommand, "R_Retorno")))
                {
                    resultado.Sucesso = false;
                    resultado.CodigoErro = Convert.ToInt32(parametroR_nErro.Value);
                    resultado.Argumentos = Convert.ToString(parametroR_sArgs.Value);
                }
                else
                    resultado.Sucesso = true;
            }            

            return resultado;

            #endregion            
        }

        #endregion
    }
}
